package Leetcode.每日一题;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @Author: kirito
 * @Date: 2024/4/29 13:22
 * @Description:
 *  将矩阵按对角线排序
 * 中等
 * 相关标签
 * 相关企业
 * 提示
 * 矩阵对角线 是一条从矩阵最上面行或者最左侧列中的某个元素开始的对角线，沿右下方向一直到矩阵末尾的元素。例如，矩阵 mat 有 6 行 3 列，从 mat[2][0] 开始的 矩阵对角线 将会经过 mat[2][0]、mat[3][1] 和 mat[4][2] 。
 *
 * 给你一个 m * n 的整数矩阵 mat ，请你将同一条 矩阵对角线 上的元素按升序排序后，返回排好序的矩阵。
 *
 *
 *
 * 示例 1：
 *
 *
 *
 * 输入：mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]
 * 输出：[[1,1,1,1],[1,2,2,2],[1,2,3,3]]
 * 示例 2：
 *
 * 输入：mat = [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]
 * 输出：[[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]
 *
 *
 * 提示：
 *
 * m == mat.length
 * n == mat[i].length
 * 1 <= m, n <= 100
 * 1 <= mat[i][j] <= 100
 */

public class diagonalSort {

    /*public int[][] diagonalSort2(int[][] mat) {
        // 获取矩阵的行数和列数
        int n = mat.length, m = mat[0].length;
        // 创建一个列表的列表，用于存储所有的主对角线和副对角线上的元素
        List<List<Integer>> diag = new ArrayList<>(m + n);
        for (int i = 0; i < m + n; i++) {
            diag.add(new ArrayList<>());
        }
        // 遍历矩阵的每个元素，将元素添加到对应的对角线上
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                diag.get(i - j + m).add(mat[i][j]);
            }
        }
        // 对每个对角线上的元素进行降序排序
        for (List<Integer> d : diag) {
            Collections.sort(d, Collections.reverseOrder());
        }
        // 将排序后的对角线元素放回矩阵中
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                mat[i][j] = diag.get(i - j + m).removeLast();
            }
        }
        // 返回排序后的矩阵
        return mat;
    }*/
    public int[][] diagonalSort(int[][] mat) {
        // 获取矩阵的行数和列数
        int m = mat.length;
        int n = mat[0].length;
        // 创建一个数组，用于存储当前对角线上的元素
        int[] a = new int[Math.min(m, n)];
        // 从上角开始，遍历所有的主对角线
        for (int k = 1 - n; k < m; k++) { // k = i - j
            // 计算当前对角线上元素的左边界和右边界
            int leftI = Math.max(k, 0);
            int rightI = Math.min(k + n, m);
            // 遍历当前对角线上的元素
            for (int i = leftI; i < rightI; i++) {
                // 将当前元素添加到数组a中
                a[i - leftI] = mat[i][i - k];
            }
            // 对数组a进行排序
            Arrays.sort(a, 0, rightI - leftI);
            // 将排序后的数组a的元素放回矩阵中
            for (int i = leftI; i < rightI; i++) {
                mat[i][i - k] = a[i - leftI];
            }
        }
        // 返回排序后的矩阵
        return mat;
    }



}
